/*
Automatic clinic tests using a robot arm.
Copyright (C) 2010  CIC-CPC, CHU Gabriel Montpied
All other trademarks, logos and copyrights are the property
of their respective owners.

This file is part of cpc-painbot.

cpc-painbot is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

cpc-painbot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with cpc-painbot.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef CPC_PAINBOT_PILOTABLE_H
#define CPC_PAINBOT_PILOTABLE_H
#include <QObject>
#include <QSharedPointer>

namespace commande {
class Commande;
}

/*! Objet auquel on peut envoyer des Commandes.
    Un Pilotable est une interface pour tout objet auquel on peut transmettre
    des Commandes : bras articulÃ©, capteurs...
    Si l'objet est susceptible d'Ã©mettre une rÃ©ponse, celle-ci est transmise
    sous la forme d'un signal attachÃ© d'une Commande correspond Ã  la rÃ©ponse.
*/
class Pilotable : public QObject {
    Q_OBJECT
public:
    /*! Constructeur.
        GÃ©nÃ¨re les propriÃ©tÃ©s communes.
    */
    Pilotable(QObject * parent = 0);

    //! Destructeur.
    virtual ~Pilotable();

public slots:
    /*! Envoie une Commande.
        Transmet une Commande Ã  l'objet Pilotable. Si celle-ci donne lieu Ã
        une rÃ©ponse, elle sera Ã©mise sous forme d'un signal.

        \param[in] cmd La Commande a Ã©mettre.
        \sa Pilotable::reponse()
    */
    virtual void envoyer(const commande::Commande * cmd) = 0;

signals:
    /*! Emet une rÃ©ponse.
        Suite Ã  l'exÃ©cution d'une Commande sur le systÃ¨me, une rÃ©ponse peut
        Ãªtre gÃ©nÃ©rÃ©e. Celle-ci est retransmise sous la forme d'un signal.

        \param cmd La Commande correspondant Ã  la rÃ©ponse.
    */
    void reponse(const QSharedPointer<commande::Commande> & cmd);
};

#endif // CPC_PAINBOT_PILOTABLE_H
